"""
定义主页数据统计相关视图
"""
# timezone是django封装的基于django配置的时间模块
from django.utils import timezone
from rest_framework.views import APIView
from rest_framework.response import Response
from users.models import User
from orders.models import OrderInfo

from datetime import timedelta

# 用户总数统计
class UserTotalCountView(APIView):

    def get(self, request):
        # 聚合查询：统计User对象的数量；
        count = User.objects.count()
        # 如何获取当前日期？！
        cur_time = timezone.localtime() # 基于django配置项TIME_ZONE的本地当前时间
        return Response({
            'count': count,
            'date': cur_time.date()
        })


# 日增用户统计
class UserDayCountView(APIView):

    def get(self, request):
        # 聚合查询：当日新增的用户数量；
        # 分析：1、目标数据(User模型类数据)；2、已知条件(当日零时刻)；
        cur_time = timezone.localtime() # 2021-5-9 15:03:56 +8:00
        cur_0_time = cur_time.replace(hour=0, minute=0, second=0) # 2021-5-9 0:0:0 +8:00
        count = User.objects.filter(
            date_joined__gte=cur_0_time
        ).count()
        return Response({
            'count': count,
            'date': cur_0_time.date()
        })


# 日活跃用户
class UserActiveCountView(APIView):

    def get(self, request):
        cur_time = timezone.localtime()  # 2021-5-9 15:03:56 +8:00
        cur_0_time = cur_time.replace(hour=0, minute=0, second=0)  # 2021-5-9 0:0:0 +8:00
        count = User.objects.filter(
            last_login__gte=cur_0_time
        ).count()

        return Response({
            'count': count,
            'date': cur_0_time.date()
        })

# 当日下单用户统计
class UserOrderCountView(APIView):

    def get(self, request):
        # 关联聚合查询：今天下了的订单关联的用户的数量；
        # 分析：1、目标数据；2、已知条件
        # 目标数据：用户数量，User模型类数据 --> 目标数据是"主表数据"
        # 已知条件：当日的零时刻 --> 已知条件是"从表的已知条件"
        # 总结：根据"从表的已知条件，查询主表目标数据"

        cur_time = timezone.localtime()  # 2021-5-9 15:03:56 +8:00
        cur_0_time = cur_time.replace(hour=0, minute=0, second=0)  # 2021-5-9 0:0:0 +8:00

        # 方案二：主表入手查询 --> 如何使用从表的已知条件，直接查询主表数据;
        user_queryset = User.objects.filter(
            orders__create_time__gte=cur_0_time
        )
        # 去重
        count = len(set(user_queryset))
        return Response({
            'count': count,
            'date': cur_0_time.date()
        })

        # 方案一：从表入手查询
        # (1)、根据从表已知条件查询出当日下了的所有的订单
        # orders = OrderInfo.objects.filter(
        #     create_time__gte=cur_0_time
        # )
        # (2)、再根据从表数据，关联查询出主表数据
        # user_set = set() # 使用集合保存用户对象，便于去重
        # for order in orders:
        #     user_set.add(order.user)
        #
        # count = len(user_set)
        # return Response({
        #     'count': count,
        #     'date': cur_0_time.date()
        # })


# 月增用户统计
class UserMonthCountView(APIView):

    def get(self, request):
        # 聚合查询：统计最近30日，包含当日，其中每日新建的用户数量
        cur_time = timezone.localtime() # 此时此刻
        end_0_time = cur_time.replace(hour=0, minute=0, second=0) # 2021-5-9 0:0:0 +8:00

        # 逆推出启始(第一天)的0时刻
        # start_0_time  =  end_0_time -（统计天数 - 1）
        start_0_time = end_0_time - timedelta(days=29)

        ret_list = []
        # 遍历得到30天中每一天的0时刻
        for index in range(30):
            # clac_0_time = start_0_time + timedelta(days=0)   index=0
            # clac_0_time = start_0_time + timedelta(days=1)   index=1
            # clac_0_time = start_0_time + timedelta(days=2)   index=2
            # .....
            # clac_0_time = start_0_time + timedelta(days=29)  index=29
            calc_0_time = start_0_time + timedelta(days=index) # 某一天0时刻
            next_0_time = calc_0_time + timedelta(days=1) # 次日0时刻
            count = User.objects.filter(
                date_joined__gte=calc_0_time,
                date_joined__lt=next_0_time
            ).count()
            ret_list.append({
                'count': count,
                'date': calc_0_time.date()
            })

        return Response(ret_list)


# 日分类商品访问量
from django.utils import timezone
from rest_framework.generics import ListAPIView
from meiduo_admin.serializers.home_serializers import *
class GoodsDayView(ListAPIView):
    queryset = GoodsVisitCount.objects.all()
    serializer_class = GoodsVisitCountSerializer

    # 过滤，出当日新增的分类访问量记录查询集
    def get_queryset(self):
        cur_0_time = timezone.localtime().replace(hour=0, minute=0, second=0)
        return self.queryset.filter(
            create_time__gte=cur_0_time
        )








